//给定两个 01 字符串 a 和 b ，请计算它们的和，并以二进制字符串的形式输出。 
//
// 输入为 非空 字符串且只包含数字 1 和 0。 
//
// 
//
// 示例 1： 
//
// 
//输入: a = "11", b = "10"
//输出: "101" 
//
// 示例 2： 
//
// 
//输入: a = "1010", b = "1011"
//输出: "10101" 
//
// 
//
// 提示： 
//
// 
// 每个字符串仅由字符 '0' 或 '1' 组成。 
// 1 <= a.length, b.length <= 10^4 
// 字符串如果不是 "0" ，就都不含前导零。 
// 
//
// 
//
// 
// 注意：本题与主站 67 题相同：https://leetcode-cn.com/problems/add-binary/ 
//
// Related Topics 位运算 数学 字符串 模拟 👍 87 👎 0


package LeetCode.editor.cn;

import java.math.BigInteger;

/**
 * @author ldltd
 * @date 2025-01-06 23:44:08
 * @description LCR 002.二进制求和
 */
public class JFETK5{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 JFETK5 fun=new JFETK5();
	 	 Solution solution = fun.new Solution();
		 System.out.println(solution.addBinary("1010", "1011"));
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String addBinary1(String a, String b) {
	    	StringBuilder sb=new StringBuilder();
			int t=0;

		for (int m=a.length()-1, n=b.length()-1; m>=0||n>=0;m--,n--) {
			if(m>=0){
				t+=(a.charAt(m)-'0');
			}
			if(n>=0){
				t+=(b.charAt(n)-'0');
			}
			sb.append(t%2);
			t=t/2;
		}
		if(t==1) sb.append(t);
		return sb.reverse().toString();
    }
	public String addBinary(String a, String b) {
		BigInteger x=new BigInteger(a);
		BigInteger y=new BigInteger(b);
		while (!y.equals(BigInteger.ZERO)){
			BigInteger res=x.xor(y);
			BigInteger carry=x.and(y);
			x=res;
			y=carry;
		}
		return x.toString(2);
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
